package busca;


import java.util.Comparator;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Queue;


public class BuscaAEstrela extends Busca {
    
    public BuscaAEstrela() {
    }
	
    public No busca(Estado inicial) {
    	startTime = System.currentTimeMillis();
    	initFechados();
    	//fila ordenada pelo f()
        Queue<No> abertos = new PriorityQueue<No>(100, getComparadorNoF());
        No nInicial = new No(inicial, null);
        abertos.add(nInicial);
        
        while (abertos.size() > 0) 
        {
            No melhor = abertos.remove();
            if (melhor.estado.isGoal()) {
            	endTime = System.currentTimeMillis();
                return melhor;
            }
            if((System.currentTimeMillis() - startTime) > 5000){
            	return null;
            }
            List<No> sucessores = sucessores(melhor);
            abertos.addAll(sucessores);
        }
        return null;
    }
    
    
    @Override
	public void run() {

    }

	Comparator<No> getComparadorNoF() {
        return new Comparator<No>() {
            public int compare(No no1, No no2) {
                try {
                    int f1 = no1.f();
                    int f2 = no2.f();
                    if (f1 > f2) {
                        return 1;
                    } else if (f1 == f2) {
                        return 0; 
                    } else {
                        return -1;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return 0;
            }
        };
    }
    
}
